#include"Task_queue.hh"


using std::mutex;
using  std::queue;
using std::condition_variable;
using std::unique_lock;

//构造
Taskqueue::Taskqueue(size_t capa)
    :_capacity(capa)
    ,_queue()
    ,_mtl()
    ,_not_full()
     ,_not_empty()
{}

bool Taskqueue::full()
{
    return _capacity==_queue.size();
}

bool Taskqueue::empty()
{
    return 0==_queue.size();
}

void Taskqueue::push(int num)
{
    //使用raii（c++提供的接口进行锁管理)
    unique_lock<mutex> ul(_mtl);
    if(full())
    {
        _not_full.wait(ul);
    }
    //插入
    _queue.push(num);
    //通知
    _not_empty.notify_one();
}

int Taskqueue::pop()
{
    unique_lock<mutex> ul(_mtl);
    if(empty())
    {
        _not_empty.wait(ul);
    }
    int ret = _queue.front();
    _queue.pop();
    _not_full.notify_one();
    return ret;
}
